/*--------------------------------------------------------------------------------------------------------------------
 *  -------------------------------------------------------------------------------------------------------------------
 *
 *  Filename: sdk_api.h
 *
 *  Description: AT interface prototypes for yuge AT commands
 *
 *  History:
 *  Jan 9, 2020- Li Tang Creation of file
 *
 *  Notes:
 *
 ******************************************************************************/
#ifndef _OLD_API_H
#define _OLD_API_H

#include "gbl_types.h"
#include "time_api.h"

typedef void (*uartRecvCallback)(UINT8 * recv_data, UINT32 recv_len);

typedef void (*usbRecvCallback)(UINT8 * recv_data, UINT32 recv_len);

typedef void (*wifiScanCallback)(UINT8 * recv_data, UINT32 recv_len);

typedef void (*cellScanExCallback)(int celltype, void *scan_data);

/*
###################################################################################################
----------------------------------------UART API---------------------------------------------------
###################################################################################################
*/

typedef enum UART_PORT_ENUM 
{
	SDK_DBG_UART_PORT = 0,	//debug uart, (RX,TX: GPIO29,30) // Can be used to receive some config cmd
	SDK_UART_PORT,			//UART
	SDK_UART3_PORT,			//UART3
	SDK_UART4_PORT,			//UART4

	SDK_UART_MAX_PORT
}UART_PORT_E;

/*
#include "UART_drv.h"

typedef enum
{
    UART_PARITY_NONE = 0,
    UART_PARITY_ODD  = 1,
    UART_PARITY_EVEN = 3,
} UART_PARITY_TYPE;

typedef enum
{
    UART_DATA_5 = 0,
    UART_DATA_6 = 1,
    UART_DATA_7 = 2,
    UART_DATA_8 = 3,
} UART_DATA_WIDTH;

typedef enum
{
    UART_ONE_STOPBIT = 0,
    UART_ONE_HALF_OR_TWO_STOPBITS = 1,
}UART_STOPBIT;
*/

typedef struct
{
    uint32_t baudrate;	// default: BAUDRATE_115200, if set 0, will enter autobaudrate detected

    uint32_t flowctrl;	// default: 0
    uint32_t datawidth;	// default: UART_DATA_8
    uint32_t parity;	// default: UART_PARITY_NONE
    uint32_t stopbit;	//default: 0( 1 stopbit); 1( 1.5 or 2 stopbit).
}s_uart_cfg;


/*****************************************************************
* Function: UART_OPEN
*
* Description:
* 	该函数用于打开内部UART接口。
* 
* Parameters:
* 	recv_cb	  	[In] 	UART回调函数，接收UART数据。
* Return:
* 	NONE
*
*****************************************************************/
void UART_OPEN(uartRecvCallback recv_cb);


/*****************************************************************
* Function: UART_CLOSE
*
* Description:
* 	该函数用于关闭内部UART接口。
* 
* Parameters:
* 	NONE
* Return:
* 	NONE
*
*****************************************************************/
void UART_CLOSE(void);

/*****************************************************************
* Function: UART_SEND_DATA
*
* Description:
* 	该函数用于内部UART发送数据，阻塞发送，直至内容全部发送成功才返回。
* 
* Parameters:
* 	bufPtr	  	[In] 	发送Buffer
* 	length	  	[In] 	发送Buffer长度
* Return:
* 	NONE
*
*****************************************************************/
void UART_SEND_DATA(UINT8 *bufPtr, UINT32 length);


/*****************************************************************
* Function: UART_GET_CONFIG
*
* Description:
* 	该函数用于获取UART参数。
* 
* Parameters:
* 	config	  	[In] 	获取UART参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART_GET_CONFIG(s_uart_cfg *config);


/*****************************************************************
* Function: UART_SET_CONFIG
*
* Description:
* 	该函数用于配置UART参数。
* 
* Parameters:
* 	config	  	[In] 	配置UART参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART_SET_CONFIG(s_uart_cfg *config);


/*****************************************************************
* Function: UART3_OPEN
*
* Description:
* 	该函数用于打开内部UART3接口。
* 
* Parameters:
* 	recv_cb	  	[In] 	UART3回调函数，接收UART3数据。
* Return:
* 	NONE
*
*****************************************************************/
void UART3_OPEN(uartRecvCallback recv_cb);


/*****************************************************************
* Function: UART3_CLOSE
*
* Description:
* 	该函数用于关闭内部UART3接口。
* 
* Parameters:
* 	NONE
* Return:
* 	NONE
*
*****************************************************************/
void UART3_CLOSE(void);

/*****************************************************************
* Function: UART3_OPEN_WITH_GPIO
*
* Description:
* 	该函数用于打开内部UART3接口,内部有多组GPIO可以作为UART3，该指令会配置对应GPIO作为UART3使用。
* 
* Parameters:
* 	recv_cb	  	[In] 	UART3回调函数，接收UART3数据。
* 	rx_gpio	  	[In] 	UART3 的RX对应的GPIO。
* 	tx_gpio	  	[In] 	UART3 的TX对应的GPIO。
* Return:
* 	NONE
*
*	1606模块，详见SDK下的文档
*	MV9: uart3对应的有两组GPIO：14/15, 53/54
*	LV9: uart3对应的有一组GPIO：53/54
*
*	1602模块，详见SDK下的文档
*	HV9\HE9: uart3对应的有三组GPIO：2/3, 14/15, 53/54
*	HV9V2: uart3对应的有四组GPIO：2/3, 10/11, 14/15, 53/54
*	CV9: uart3对应的有四组GPIO：2/3, 10/11, 14/15, 53/54
*
*	需要使用多组uart3的场景下，UART3_OPEN_WITH_GPIO 和 UART3_CLOSE_WITH_GPIO，
*	UART3_CLOSE_WITH_GPIO关闭当前UARt3后再使用UART3_OPEN_WITH_GPIO开启另外一组UART3，
*	即不能同时使用。
*****************************************************************/
void UART3_OPEN_WITH_GPIO(uartRecvCallback recv_cb, UINT8 rx_gpio, UINT8 tx_gpio);

/*****************************************************************
* Function: UART3_CLOSE
*
* Description:
* 	该函数用于关闭内部UART3接口，并重置对应的GPIO脚。
* 
* Parameters:
* 	rx_gpio	  	[In] 	UART3 的RX对应的GPIO。
* 	tx_gpio	  	[In] 	UART3 的TX对应的GPIO。
* Return:
* 	NONE
*
*****************************************************************/
void UART3_CLOSE_WITH_GPIO(UINT8 rx_gpio, UINT8 tx_gpio);


/*****************************************************************
* Function: UART3_SEND_DATA
*
* Description:
* 	该函数用于内部UART3发送数据，阻塞发送，直至内容全部发送成功才返回。
* 
* Parameters:
* 	bufPtr	  	[In] 	发送Buffer
* 	length	  	[In] 	发送Buffer长度
* Return:
* 	NONE
*
*****************************************************************/
void UART3_SEND_DATA(UINT8 *bufPtr, UINT32 length);


/*****************************************************************
* Function: UART3_GET_CONFIG
*
* Description:
* 	该函数用于获取UART3参数。
* 
* Parameters:
* 	config	  	[In] 	获取UART3参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART3_GET_CONFIG(s_uart_cfg *config);


/*****************************************************************
* Function: UART3_SET_CONFIG
*
* Description:
* 	该函数用于配置UART3参数。
* 
* Parameters:
* 	config	  	[In] 	配置UART3参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART3_SET_CONFIG(s_uart_cfg *config);


/*****************************************************************
* Function: UART4_OPEN
*
* Description:
* 	该函数用于打开内部UART接口。
* 
* Parameters:
* 	recv_cb	  	[In] 	UART回调函数，接收UART数据。
* Return:
* 	NONE
*
*****************************************************************/
void UART4_OPEN(uartRecvCallback recv_cb);


/*****************************************************************
* Function: UART4_SET_BAUD
*
* Description:
* 	该函数用于关闭内部UART接口。
* 
* Parameters:
* 	NONE
* Return:
* 	NONE
*
*****************************************************************/
void UART4_CLOSE(void);

/*****************************************************************
* Function: UART4_SEND_DATA
*
* Description:
* 	该函数用于内部UART4发送数据，阻塞发送，直至内容全部发送成功才返回。
* 
* Parameters:
* 	bufPtr	  	[In] 	发送Buffer
* 	length	  	[In] 	发送Buffer长度
* Return:
* 	NONE
*
*****************************************************************/
void UART4_SEND_DATA(UINT8 *bufPtr, UINT32 length);



/*****************************************************************
* Function: UART4_GET_CONFIG
*
* Description:
* 	该函数用于获取UART4参数。
* 
* Parameters:
* 	config	  	[In] 	获取UART4参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART4_GET_CONFIG(s_uart_cfg *config);


/*****************************************************************
* Function: UART4_SET_CONFIG
*
* Description:
* 	该函数用于配置UART4参数。
* 
* Parameters:
* 	config	  	[In] 	配置UART3参数，详见s_uart_cfg。
* Return:
* 	NONE
*
*****************************************************************/
void UART4_SET_CONFIG(s_uart_cfg *config);

/*****************************************************************
* Function: SDK_GET_BEIJING_TIME
*
* Description:
* 	该函数用于直接获取北京时间。
* 
* Parameters:
* 	bjGetTime	  	[In] 	t_rtc
* 						
* Return:
* 	NONE
*
*****************************************************************/
void SDK_GET_BEIJING_TIME(t_rtc *bjGetTime);

/*****************************************************************
* Function: SDK_GET_UTC_TIME
*
* Description:
* 	该函数用于直接获取UTC时间和模块预设的时区。
* 
* Parameters:
* 	utcGetTime	  	[In] 	t_rtc
* 	timezone	  	[In] 	时区：(-48 ~ +56)*15
* Return:
* 	NONE
*
*****************************************************************/
void SDK_GET_UTC_TIME(t_rtc *utcGetTime, int *timezone);

/*****************************************************************
* Function: OEM_USB_OPEN
*
* Description:
* 	该函数用于打开内部USB接口，打开后退出modem或者at口，不能进行ppp拨号或者AT指令。
* 
* Parameters:
* 	usbindex  	[In] 	usbindex:
* 							0: USB MODEM PORT 	{YUGA LTE USB Modem 4E3C}
* 							1: USB AT PORT		{YUGA HS-USB AT 4E3C(COMX)}
* 	recv_cb	  	[In] 	USB PORT回调函数，接收USB PORT数据。
* Return:
* 	NONE
*
*****************************************************************/
void OEM_USB_OPEN(int usbindex, usbRecvCallback recv_cb);

/*****************************************************************
* Function: OEM_USB_CLOSE
*
* Description:
* 	该函数用于关闭内部USB接口,USB关闭后即可回复成modem 或者 at口。
* 
* Parameters:
* 	usbindex  	[In] 	usbindex:
* 							0: USB MODEM PORT 	{YUGA LTE USB Modem 4E3C}
* 							1: USB AT PORT		{YUGA HS-USB AT 4E3C(COMX)}
* Return:
* 	NONE
*
*****************************************************************/
void OEM_USB_CLOSE(int usbindex);

/*****************************************************************
* Function: OEM_USB_SEND_DATA
*
* Description:
* 	该函数用于内部USB发送数据，阻塞发送，直至内容全部发送成功才返回。
* 
* Parameters:
* 	usbindex  	[In] 	usbindex:
* 							0: USB MODEM PORT 	{YUGA LTE USB Modem 4E3C}
* 							1: USB AT PORT		{YUGA HS-USB AT 4E3C(COMX)}
* 	bufPtr	  	[In] 	发送Buffer
* 	length	  	[In] 	发送Buffer长度
* Return:
* 	NONE
*
*****************************************************************/
void OEM_USB_SEND_DATA(int usbindex, UINT8 *bufPtr, UINT32 length);


/*****************************************************************
* Function: OEM_SET_ALLOW_ENTER_SLEEP_FALG
*
* Description:
* 	该函数用于设置是否允许设备进入低功耗状态FLAG，
* 
* Parameters:
* 	flag  		[In] 	是否允许进入低功耗，允许后，如果条件满足会自动进入低功耗:
* 							0: 不允许
* 							1: 允许
* Return:
* 	NONE
*
*****************************************************************/
void OEM_SET_ALLOW_ENTER_SLEEP_FALG(int flag);

/*****************************************************************
* Function: OEM_GET_ALLOW_ENTER_SLEEP_FALG
*
* Description:
* 	该函数用于获取是否允许设备进入低功耗状态FLAG，
* 
* Parameters:
* 	NONE
* Return:
* 	flag  		是否允许进入低功耗，允许后，如果条件满足会自动进入低功耗:
* 							0: 不允许
* 							1: 允许*
*****************************************************************/
int OEM_GET_ALLOW_ENTER_SLEEP_FALG(void);

/*****************************************************************
* Function: CELL_SCAN_START_EX
*
* Description:
* 	该函数用于扫描主小区和邻小区参数,可获取mcc、mnc、tac、cellId、EuArfcn、phyCellId、rsrp、rsrq、sinr以及更多参数，扫描数据cb函数返回。
* 
* Parameters:
	
* 	mode  	[In] 	小区信息扫描选项
* 							1: 只扫描主小区
* 							2: 扫描主小区和邻区
* 	cb	  	[In] 	cellScanExCallback,邻小区扫描数据cb函数返回。
* 					cellScanExCallback 参数描述: //扫描结束时cb参数: 0,NULL
* 						celltype: 0:扫描结束，1:主小区信息，2:同频邻区信息，3:异频邻区信息
* 						scan_data: 详见sample\8.1-cellinfo
* Return:
* 	NONE
*
*
*部分参数换算说明:
*	0 rsrp < -140 dBm 
*	1 -140 dBm ≤ rsrp < -139 dBm 
*	2 -139 dBm ≤ rsrp < -138 dBm 
*	: : : :
*	95 -46 dBm ≤ rsrp < -45 dBm 
*	96 -45 dBm ≤ rsrp < -44 dBm 
*	97 -44 dBm ≤ rsrp 
*	255 not known or not detectable
*	
*	0 rsrq < -19.5 dB 
*	1 -19.5 dB ≤ rsrq < -19 dB 
*	2 -19 dB ≤ rsrq < -18.5 dB 
*	: : : : 
*	32 -4 dB ≤ rsrq < -3.5 dB 
*	33 -3.5 dB ≤ rsrq < -3 dB 
*	34 -3 dB ≤ rsrq 
*	255 not known or not detectable
*****************************************************************/
void CELL_SCAN_START_EX(int mode, cellScanExCallback cb);

typedef enum CISIMPINSTATE_TAG {
    CI_SIM_PIN_ST_READY,                         					/**< SIM is ready */

    CI_SIM_PIN_ST_CHV1_REQUIRED,                 	 /**< SIM is locked; waiting for a CHV1 password  */
    CI_SIM_PIN_ST_CHV2_REQUIRED,                 	 /**< SIM is locked; waiting for a CHV2 password  */
    CI_SIM_PIN_ST_UNBLOCK_CHV1_REQUIRED,         	 /**< SIM is blocked; CHV1 unblocking password is required */
    CI_SIM_PIN_ST_UNBLOCK_CHV2_REQUIRED,         	 /**< SIM is blocked; CHV2 unblocking password is required */

    /* Note: the '**CK' states are not fully supported at this time */
    CI_SIM_PIN_ST_PCK_REQUIRED,                 	/**< SIM is locked due to a SIM/USIM personalization check failure.
													 * SIM is waiting for a PCK control key to deactivate SIM/USIM personalization. */
    CI_SIM_PIN_ST_NCK_REQUIRED,                  	/**< SIM is locked due to a network personalization check failure.
													 * SIM is waiting for a NCK control key to deactivate network personalization. */
    CI_SIM_PIN_ST_NSCK_REQUIRED,                 	/**< SIM is locked due to a network subset personalization check failure.
													 * SIM is waiting for a NSCK control key to deactivate network subset personalization. */
	CI_SIM_PIN_ST_SPCK_REQUIRED,                 	/**< SIM is locked due to a service provider personalization check failure.
													 * SIM is waiting for a SPCK control key to deactivate service provider personalization. */
	CI_SIM_PIN_ST_CCK_REQUIRED,                      /**< SIM is locked due to a corporate personalization check failure.
													 * SIM is waiting for a CCK control key to deactivate corporate personalization. */
    CI_SIM_PIN_ST_UNBLOCK_PCK_REQUIRED,          	 /**< SIM is blocked due to an incorrect PCK; an MEP unblocking password is required. */
    CI_SIM_PIN_ST_UNBLOCK_NCK_REQUIRED,          	 /**< SIM is blocked due to an incorrect NCK; an MEP unblocking password is required. */
    CI_SIM_PIN_ST_UNBLOCK_NSCK_REQUIRED,         	 /**< SIM is blocked due to an incorrect NSCK; an MEP unblocking password is required. */
    CI_SIM_PIN_ST_UNBLOCK_SPCK_REQUIRED,         	 /**< SIM is blocked due to an incorrect SPCK; an MEP unblocking password is required. */
    CI_SIM_PIN_ST_UNBLOCK_CCK_REQUIRED,          	 /**< SIM is blocked due to an incorrect CCK; an MEP unblocking password is required. */

    /* note, according to 3GPP TS 22.022, v3.4.0, there is no standard way to unblock a locked */
    /* personalization key */

    /* Note: the 'HIDDENKEY' states are not supported at this time */
    CI_SIM_PIN_ST_HIDDENKEY_REQUIRED,            			/**< Expecting key for hidden phone book entries */
    CI_SIM_PIN_ST_UNBLOCK_HIDDENKEY_REQUIRED,    		/**< Expecting code to unblock the hidden key */

    CI_SIM_PIN_ST_UNIVERSALPIN_REQUIRED,         			/**< Expecting the universal PIN */
    CI_SIM_PIN_ST_UNBLOCK_UNIVERSALPIN_REQUIRED,		/**< Expecting code to unblock the universal PIN */

    CI_SIM_PIN_ST_CHV1_BLOCKED,                  				/**< Use of CHV1 is blocked */
    CI_SIM_PIN_ST_CHV2_BLOCKED,                  				/**< Use of CHV2 is blocked */
    CI_SIM_PIN_ST_UNIVERSALPIN_BLOCKED,          			/**< Use of the universal PIN is blocked */
    CI_SIM_PIN_ST_UNBLOCK_CHV1_BLOCKED,          		/**< Use of code to unblock the CHV1 is blocked */
    CI_SIM_PIN_ST_UNBLOCK_CHV2_BLOCKED,          		/**< Use of code to unblock the CHV2 is blocked */
    CI_SIM_PIN_ST_UNBLOCK_UNIVERSALPIN_BLOCKED,	 	/**< Use of code to unblock the universal PIN is blocked */

    CI_SIM_PIN_ST_NETWORK_REJECTED,              			/**< SIM was rejected by the network. See GSM 03.22 for possible reasons of network rejection. For example, IMSI is unknown in
                                                            *    the HLR or the IMSI is on the blacklist.  */
    CI_SIM_PIN_ST_WAIT_INITIALISATION,           			/**< SIM is being initialized; waiting for completion */
    CI_SIM_PIN_ST_INIT_FAILED,                   					/**< SIM initialization failed */
    CI_SIM_PIN_ST_REMOVED,                       				/**< SIM was removed */
    CI_SIM_PIN_ST_WRONG_SIM,                     				/**< SIM was inserted but was not accepted by the protocol stack */
    CI_SIM_PIN_ST_GENERAL_ERROR,                 				/**< SIM access encountered a serious error */
    CI_SIM_PIN_ST_MEP_ERROR,                     				/**< Error in checking or accessing ME personalization data */
    CI_SIM_PIN_ST_UDP_ERROR,							/**< Error in checking or accessing UDP personalization data */
    CI_SIM_PIN_ST_CPHS_ERROR,                    				/**<  Error in accessing CPHS data */

	CI_SIM_PIN_ST_EMPTY_ESIM,                           /**<  SIM is being initialized, but empty eSIM */

    CI_SIM_PIN_NUM_STATES
} _CiSimPinState;

typedef UINT8 CiSimPinState;

CiSimPinState SDK_GetSimStatus(uint8_t index);

/*****************************************************************
* Function: SDK_GetSimImsi
*
* Description:
* 	获取SIM卡的IMSI。
* 
* Parameters:
* 	index	  		[in] 	0:SIM1, 1:SIM2。 
* 	buf	  			[out] 	SIM卡的IMSI，字符串。 
* 	size		  	[in] 	IMSI 数组的长度。 
* Return:
* 	TRUE			成功。
*	FALSE		 	失败。
*
*****************************************************************/
BOOL SDK_GetSimImsi(uint8_t index,uint8_t *buf,int size);


/*****************************************************************
* Function: SDK_GetSimIccid
*
* Description:
* 	获取SIM卡的ICCID。
* 
* Parameters:
* 	index	  		[in] 	0:SIM1, 1:SIM2。 
* 	buf	  			[out] 	SIM卡的ICCID，字符串。 
* 	size		  	[in] 	ICCID 数组的长度。 
* Return:
* 	TRUE			成功。
*	FALSE		 	失败。
*
*****************************************************************/
BOOL SDK_GetSimIccid(uint8_t index,uint8_t *buf,int size);


/*****************************************************************
* Function: SDK_GetDevImei
*
* Description:
* 	获取设备的IMEI。
* 
* Parameters:
* 	buf	  			[out] 	设备的IMEI，字符串。 
* 	size		  	[in] 	IMEI 数组的长度。 
* Return:
* 	TRUE			成功。
*	FALSE		 	失败。
*
*****************************************************************/
BOOL SDK_GetDevImei(uint8_t *buf,int size);

/*****************************************************************
* Function: SDK_GetDevSn
*
* Description:
* 	获取设备的SN。
* 
* Parameters:
* 	buf	  			[out] 	设备的SN，字符串。 
* 	size		  	[in] 	SN 数组的长度。 
* Return:
* 	TRUE			成功。
*	FALSE		 	失败。
*
*****************************************************************/
BOOL SDK_GetDevSn(uint8_t *buf, int size);

/*****************************************************************
* Function: SDK_CheckDevImeiHaveWrited
*
* Description:
* 	判断IMEI号是否正常写入，用于判定IMEI未写入时，禁止设备重启(提供固件给原厂生产时候需要考虑)。
* 
* Parameters:
* 	NONE
* Return:
* 	0			未写入，此时读取的imei号为默认的"123456789012347"。
*	1		 	已写入。
*
*****************************************************************/
int SDK_CheckDevImeiHaveWrited(void);

/*****************************************************************
* Function: SDK_CheckDevInProductionMode
*
* Description:
* 	判断模块是否处于工厂生产模式，用于判定出入生产模式下，禁止设备重启(提供固件给原厂生产时候需要考虑)。
* 
* Parameters:
* 	NONE
* Return:
* 	0			正常默认。
*	1		 	生产模式(工厂生产是开机会通过AT指令设定进去生产模式，客户判定该条件最好是开机1分钟以后)。
*
*****************************************************************/
int SDK_CheckDevInProductionMode(void);

/*****************************************************************
* Function: SDK_CtrlDev_Reset
*
* Description:
* 	设备重启。
* 
* Parameters:
* 	type	  			[int] 	0: 立即重启， 1: 先进入飞行模式，再重启，可能比较耗时。
* Return:
* 	NONE
*
*****************************************************************/
void SDK_CtrlDev_Reset(int type);

/*****************************************************************
* Function: SDK_CtrlDev_Reset
*
* Description:
* 	设备关机。
* 
* Parameters:
* 	type	  			[int] 	0: 立即关机， 1: 先进入飞行模式，再关机，可能比较耗时。
* Return:
* 	NONE
*
*****************************************************************/
void SDK_CtrlDev_Poweroff(int type);

/*****************************************************************
* Function: SDK_Get_CSQ
*
* Description:
* 	获取当前网络的CSQ,参数同AT+CSQ返回值一致。
* 
* Parameters:
* 	pSignalRssi	  	[out] 	rssi。 
*		0 - 113 dBm or less
*		1 - 111 dBm
*		2 - 109 dBm
*		......
*		30 - 53 dBm
*		31 -51 dBm
*		99 not known or not detectable
* 	pSignalBer		[out] 	ber。 
* 		0...7 as RXQUAL values in the table in TS 45.008 subclause 8.2.4 
* 		99 not known or not detectable
* Return:
* 	NONE
*
*****************************************************************/
void SDK_Get_CSQ(int *pSignalRssi,int *pSignalBer);


/*

参数说明：
sATPInd：AT执行通道，不需要管，SIM1使用TEL_AT_CMD_ATP_12，SIM2使用TEL_AT_CMD_ATP_12+36 //1606平台默认都是单卡单待，双卡也是通过切换物理通道实现的，即不用考虑SIM2的情况。
inStr：AT指令字符串
timeOut：超时时间，单位s
okFmt：注意的参数，这里一般时判断是判断AT返回时，OK之前的正常上报数据，但是不要填写"OK"，会和okFlag冲突造成异常，比如如下三个AT
AT^SYSINFO
^SYSINFO: 0,0,0,0,255

OK
SendATCMDWaitResp(TEL_AT_CMD_ATP_12, "AT^SYSINFO\r\n", 3, "^SYSINFO:", 1, NULL, resp_str, sizeof(resp_str));
也可以不关注okFmt, resp_str中解析判断即可
SendATCMDWaitResp(TEL_AT_CMD_ATP_12, "AT^SYSINFO\r\n", 3, NULL, 1, NULL, resp_str, sizeof(resp_str));

AT+CGSN
123456789012347

OK
SendATCMDWaitResp(TEL_AT_CMD_ATP_12, "AT+CGSN\r\n", 3, NULL, 1, NULL, resp_str, sizeof(resp_str));

AT+CMGF=1
OK
SendATCMDWaitResp(TEL_AT_CMD_ATP_12, "AT+CMGF=1\r\n", 3, NULL, 1, NULL, resp_str, sizeof(resp_str));


okFlag：正常都是1，即表示捕捉OK作为AT的成功返回标志

errFmt：一般填写"ERROR"，或者更准确的错误信息，判断到错误返回会在timeout之前结束AT
outStr：AT返回的结果，如"^SYSINFO: 0,0,0,0,255"
outLen: sizeof(outStr)
*/

int SendATCMDWaitResp(int sATPInd, char *inStr, int timeOut, char *okFmt, int okFlag, char *errFmt, char *outStr, int outLen);







#define IND_REQ_HANDLE 1
#define IND_REQ_HANDLE_1 2

BOOL isMasterSim0(void);

UINT8 getCeregReady(UINT32 atHandle);







typedef void (*GPIOCallback)(void);

typedef enum
{
	GPIORC_FALSE = 0,
	GPIORC_TRUE = 1,
	GPIORC_LOW = 0,
	GPIORC_HIGH = 1,

	GPIORC_OK = 0,
    GPIORC_INVALID_PORT_HANDLE = -100,
    GPIORC_NOT_OUTPUT_PORT,
    GPIORC_NO_TIMER,
    GPIORC_NO_FREE_HANDLE,
    GPIORC_AMOUNT_OUT_OF_RANGE,
    GPIORC_INCORRECT_PORT_SIZE,
    GPIORC_PORT_NOT_ON_ONE_REG,
    GPIORC_INVALID_PIN_NUM,
    GPIORC_PIN_USED_IN_PORT,
    GPIORC_PIN_NOT_FREE,
    GPIORC_PIN_NOT_LOCKED,
    GPIORC_NULL_POINTER,
    GPIORC_PULLED_AND_OUTPUT,
	GPIORC_INCORRECT_PORT_TYPE,
	GPIORC_INCORRECT_TRANSITION_TYPE,
	GPIORC_INCORRECT_DEBOUNCE,
	GPIORC_INCORRECT_DIRECTION,
	GPIORC_INCORRECT_PULL,
	GPIORC_INCORRECT_INIT_VALUE,
	GPIORC_WRITE_TO_INPUT
}GPIOReturnCode;

typedef enum
{
    GPIO_IN_PIN = 0,
    GPIO_OUT_PIN = 1
}GPIOPinDirection;

typedef enum
{
    GPIO_PULL_DISABLE = 0,
    GPIO_PULLUP_ENABLE,
    GPIO_PULLDN_ENABLE
}GPIOPullUpDown;

typedef enum
{
    GPIO_NO_EDGE = 0,
    GPIO_RISE_EDGE,
    GPIO_FALL_EDGE,
    GPIO_TWO_EDGE,
}GPIOTransitionType;


typedef struct
{
	GPIOPinDirection pinDir;
	UINT32			initLv;
	GPIOPullUpDown 	pinPull;
	GPIOTransitionType pinEd;
	GPIOCallback isr;
	GPIOCallback wu;
} GPIOConfiguration;

/***********************************************************************
* Function: GpioSetLevel                                              *
************************************************************************
* Description: Writes a value to a port					               *
*                                                                      *
* Parameters:	portHandle - the port handle                           *
*				value - the value to be written						   *
*                                                                      *
* Return value: GPIORC_OK		                                       *
*				GPIORC_INVALID_PORT_HANDLE
*				GPIORC_INCORRECT_INIT_VALUE
*				GPIORC_WRITE_TO_INPUT								   *
*                                                                      *
* Notes:                                                               *
***********************************************************************/
GPIOReturnCode GpioSetLevel(UINT32 portHandle, UINT32 value);

/***********************************************************************
* Function: GpioGetLevel                                              *
************************************************************************
* Description: Get current level of a port					           *
*                                                                      *
* Parameters:	portHandle - the port handle                           *
*										   							   *
*                                                                      *
* Return value: GPIORC_LOW
				GPIORC_HIGH  										   *
*				GPIORC_INVALID_PORT_HANDLE
*
*			                                            			   *
* Notes:                                                               *
***********************************************************************/
GPIOReturnCode GpioGetLevel(UINT32 portHandle);

/***********************************************************************
* Function: GpioSetDirection                                           *
************************************************************************
* Description: Controls the direction of a given port                  *
*                                                                      *
* Parameters:	portHandle - the port handle                           *
*				dir - the required direction						   *
*                                                                      *
* Return value: GPIORC_OK		                                       *
*				GPIORC_INVALID_PORT_HANDLE						       *
*               GPIORC_INCORRECT_DIRECTION
				GPIORC_PIN_USED_IN_PORT							   *
*                                                                      *
* Notes:                                                               *
* 																	   *
*																	   *
* 																	   *
* If the port is with interrupt, it can not be changed to output with *
* this API																*
*************************************************************************/
GPIOReturnCode GpioSetDirection(UINT32 portHandle, GPIOPinDirection dir);

/***********************************************************************
* Function: GpioGetDirection                                           *
************************************************************************
* Description: Get the direction of a given port                  	   *
*                                                                      *
* Parameters:	portHandle - the port handle                           *
*                                                                      *
* Return value: GPIO_IN_PIN
				GPIO_OUT_PIN										   *
*				GPIORC_INVALID_PORT_HANDLE						       *
*
*                                                                      *
* Notes:                                                               *
* 																	   *
**************************************************************************/
GPIOPinDirection GpioGetDirection(UINT32 portHandle);

/***********************************************************************
* Function: GpioBindWakeupCallback                          		   *
************************************************************************
* Description: Bind a callback function to a GPIO's wakeup event       *
*                                                                      *
* Parameters:	portHandle - the port handle                           *
*                                                                      *
* Return value: GPIORC_OK
				GPIO_NULL_POINTER 									   *
*				GPIORC_INVALID_PORT_HANDLE			                   *
* Notes:                                                               *
* 																	   *
**************************************************************************/
GPIOReturnCode GpioInitConfiguration(UINT32 portHandle, GPIOConfiguration config);


UINT32 GPIO_MFPR_ADDR(UINT32 n);


int get_at_ota_progress(unsigned int requestHandle);

void PM812_SW_RESET(void);

void sdklogConfig(int type);

void sdkLogPrintf(const char *fmt, ...);

#endif

